#include "Acceptor.h"

Acceptor::Acceptor(EventLoop *loop, const std::string &ip, const uint16_t port) 
    : loop_(loop) ,servsock_(createnonblocking()),acceptchannel_(loop_, servsock_.fd())
{
    // 1. 创建非阻塞服务端套接字
    //servsock_ = new Socket(createnonblocking());  // 假设 createnonblocking() 返回非阻塞fd

    // 2. 设置套接字选项
    InetAddress servaddr(ip, port);  // 封装IP和端口
    servsock_.setreuseaddr(true);    // 允许地址重用（快速重启）
    servsock_.settcpnodelay(true);   // 禁用Nagle算法（低延迟）
    servsock_.setreuseport(true);    // 允许多进程监听同一端口
    servsock_.setkeepalive(true);    // 启用TCP保活

    // 3. 绑定并监听
    servsock_.bind(servaddr);
    servsock_.listen();              // 默认backlog由系统决定

    // 4. 注册到事件循环
    //acceptchannel_ = new Channel(loop_, servsock_.fd());
    acceptchannel_.setreadcallback(std::bind(&Acceptor::newconnection, this));  // 修正：应为Acceptor的成员函数 
    acceptchannel_.enablereading();  // 监听读事件（新连接）
}

Acceptor::~Acceptor() {
    // delete servsock_;      // 关闭监听套接字
    // delete acceptchannel_; // 从事件循环注销
}

void Acceptor::newconnection()
{
    InetAddress clientaddr;
    /*
    注意：只能new 否则析构函数会关闭fd
    还有，这里new出来的对象没有释放，这个问题以后再解决
    */
    Socket *clientsock = new Socket(servsock_.accept(clientaddr));
    clientsock->setipport(clientaddr.ip(),clientaddr.port());

    if (clientsock->fd() < 0)
    {
        perror("accept() failed");
        return;
    }

    // Connection *conn = new Connection(loop_,clientsock);
    newconnectioncb_(clientsock);

    printf("hahahahNew client connected: %s:%d\n", clientsock->ip().c_str(), clientsock->port());
}

void Acceptor::setnewconnectioncb(std::function<void(Socket*)> fn)
{
    newconnectioncb_ = fn;
}